import { request } from '@/utils/request/axios';
import { ErrorMessageMode, PageRequest, PageData, FilterGroup } from '#/request';
import {
  UserDto,
  UserOutputDto,
  UserNode,
  UserOrganizationNode,
  UserInputDto,
  UserSetRoleDto,
  UserSetOrganizationDto,
  UserSetModuleDto,
} from './model';

/** 管理-用户信息枚举 */
enum Api {
  /** 读取用户 */
  Read = '/api/admin/user/read',
  /** 读取用户节点 */
  ReadNode = '/api/admin/user/readNode',

  /** 获取用户 */
  GetUsers = '/api/admin/user/getUsers',
  /** 获取用户树数据 */
  GetUserNodes = '/api/admin/user/getUserNodes',

  /** 读取用户[角色]树数据 */
  ReadRoleUsers = '/api/admin/user/readRoleUsers',
  /** 读取用户[组织机构]树数据 */
  ReadOrganizationUsers = '/api/admin/user/readOrganizationUsers',

  /** 新增用户信息 */
  Create = '/api/admin/user/create',
  /** 更新用户信息 */
  Update = '/api/admin/user/update',
  /** 删除用户信息 */
  Delete = '/api/admin/user/delete',

  /** 设置用户角色 */
  SetRoles = '/api/admin/user/setRoles',
  /** 设置用户组织机构 */
  SetOrganizations = '/api/admin/user/setOrganizations',

  /** 设置用户模块 */
  SetModules = '/api/admin/user/setModules',
}

//#region 读取用户
/**
 * 读取用户
 * @param params 分页请求
 * @param mode 错误消息模型
 */
export function readUsers(params: PageRequest, mode: ErrorMessageMode = 'message') {
  return request.post<PageData<UserOutputDto>>(
    {
      url: Api.Read,
      params: params,
    },
    {
      errorMessageMode: mode,
    },
  );
}
//#endregion
//#region 读取用户节点
/**
 * 读取用户节点
 * @param group 筛选条件组
 * @param mode 错误消息模型
 */
export function readUserNodes(group: FilterGroup, mode: ErrorMessageMode = 'message') {
  return request.post<UserNode[]>(
    {
      url: Api.ReadNode,
      params: group,
    },
    {
      errorMessageMode: mode,
    },
  );
}
//#endregion

//#region 获取用户
/**
 * 获取用户
 * @param userIds 用户编号
 * @param mode 错误消息模型
 */
export function getUsers(userIds: (string | bigint)[], mode: ErrorMessageMode = 'message') {
  return request.post<UserDto[]>(
    {
      url: Api.GetUsers,
      params: userIds,
    },
    {
      errorMessageMode: mode,
    },
  );
}
//#endregion
//#region 获取用户树数据
/**
 * 获取用户树数据
 * @param userIds 已选择的用户编号
 * @param mode 错误消息模型
 */
export function getUserNodes(userIds: (string | bigint)[], mode: ErrorMessageMode = 'message') {
  return request.post<UserNode[]>(
    {
      url: Api.GetUserNodes,
      params: userIds,
    },
    {
      errorMessageMode: mode,
    },
  );
}
//#endregion

//#region 读取用户[角色]树数据
/**
 * 读取用户[角色]树数据
 * @param roleId 角色编号
 * @param mode 错误消息模型
 */
export function readRoleUsers(roleId: string | bigint, mode: ErrorMessageMode = 'message') {
  return request.get<UserNode[]>(
    {
      url: Api.ReadRoleUsers,
      params: { roleId: roleId },
    },
    {
      errorMessageMode: mode,
    },
  );
}
//#endregion
//#region 读取用户[组织机构]树数据
/**
 * 读取用户[组织机构]树数据
 * @param organizationId 组织机构编号
 * @param mode 错误消息模型
 */
export function readOrganizationUsers(
  organizationId: string | bigint,
  mode: ErrorMessageMode = 'message',
) {
  return request.get<UserOrganizationNode[]>(
    {
      url: Api.ReadOrganizationUsers,
      params: { organizationId: organizationId },
    },
    {
      errorMessageMode: mode,
    },
  );
}
//#endregion

//#region 新增用户信息
/**
 * 新增用户信息
 * @param dtos 用户信息
 * @param mode 错误消息模型
 */
export function createUsers(dtos: UserInputDto[], mode: ErrorMessageMode = 'message') {
  return request.post(
    {
      url: Api.Create,
      params: dtos,
    },
    {
      errorMessageMode: mode,
    },
  );
}
//#endregion
//#region 更新用户信息
/**
 * 更新用户信息
 * @param dtos 用户信息
 * @param mode 错误消息模型
 */
export function updateUsers(dtos: UserInputDto[], mode: ErrorMessageMode = 'message') {
  return request.post(
    {
      url: Api.Update,
      params: dtos,
    },
    {
      errorMessageMode: mode,
    },
  );
}
//#endregion
//#region 删除用户信息
/**
 * 删除用户信息
 * @param ids 要删除的用户编号集合
 * @param mode 错误消息模型
 */
export function deleteUsers(ids: (string | bigint)[], mode: ErrorMessageMode = 'message') {
  return request.post(
    {
      url: Api.Delete,
      params: ids,
    },
    {
      errorMessageMode: mode,
    },
  );
}
//#endregion

//#region 设置用户角色
/**
 * 设置用户角色
 * @param dtos 用户角色信息
 * @param mode 错误消息模型
 */
export function setUserRoles(dtos: UserSetRoleDto, mode: ErrorMessageMode = 'message') {
  return request.post(
    {
      url: Api.SetRoles,
      params: dtos,
    },
    {
      errorMessageMode: mode,
    },
  );
}
//#endregion
//#region 设置用户组织机构
/**
 * 设置用户组织机构
 * @param dtos 用户组织机构信息
 * @param mode 错误消息模型
 */
export function setUserOrganizations(
  dtos: UserSetOrganizationDto,
  mode: ErrorMessageMode = 'message',
) {
  return request.post(
    {
      url: Api.SetOrganizations,
      params: dtos,
    },
    {
      errorMessageMode: mode,
    },
  );
}
//#endregion

//#region 设置用户模块
/**
 * 设置用户模块
 * @param dtos 用户组织机构信息
 * @param mode 错误消息模型
 */
export function setUserModules(dtos: UserSetModuleDto, mode: ErrorMessageMode = 'message') {
  return request.post(
    {
      url: Api.SetModules,
      params: dtos,
    },
    {
      errorMessageMode: mode,
    },
  );
}
//#endregion
